package com.easyexcle.demo.easyExcel.dymic;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.ReflectionUtils;

import java.lang.reflect.Field;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;

/**
 * @Author: lkz
 * @Title: Test
 * @Description: TODO
 * @Date: 2023/6/30 13:52
 */
@Slf4j
public class Test {


    public static void main(String[] args) {
        List<TestVO> voList=new ArrayList<>();
        voList.add(TestVO.builder().name("时间").inGroupNum("计划入组数").actualNum("实际入组数").planStartCoreNum("计划启动中心数").actualStartCoreNum("实际启动中心数").adjustStartCoreNum("调整启动中心数").exitNum("退出受试者数").build());
        voList.add(TestVO.builder().name("2023/08").inGroupNum("10").actualNum("0").planStartCoreNum("0").actualStartCoreNum("0").adjustStartCoreNum("0").exitNum("0").build());
        voList.add(TestVO.builder().name("2023/09").inGroupNum("20").actualNum("0").planStartCoreNum("0").actualStartCoreNum("0").adjustStartCoreNum("0").exitNum("0").build());
        voList.add(TestVO.builder().name("2023/10").inGroupNum("30").actualNum("0").planStartCoreNum("0").actualStartCoreNum("0").adjustStartCoreNum("0").exitNum("0").build());
        voList.add(TestVO.builder().name("2023/11").inGroupNum("40").actualNum("0").planStartCoreNum("0").actualStartCoreNum("0").adjustStartCoreNum("0").exitNum("0").build());
        voList.add(TestVO.builder().name("2023/12").inGroupNum("50").actualNum("0").planStartCoreNum("0").actualStartCoreNum("0").adjustStartCoreNum("0").exitNum("0").build());
        voList.add(TestVO.builder().name("2024/01").inGroupNum("60").actualNum("0").planStartCoreNum("0").actualStartCoreNum("0").adjustStartCoreNum("0").exitNum("0").build());
       List<String> headset=new CopyOnWriteArrayList<>();
        voList.stream().forEach(v->{
            headset.add(v.getName());
        });
      List<List<String>> tempHead=new CopyOnWriteArrayList<>();

        headset.forEach(h->{
            List<String> head = new ArrayList<>();
            head.add(h);
            tempHead.add(head);
        });



        List<List<String>> dataListC = new ArrayList<>();
        if (CollectionUtil.isNotEmpty(voList)) {
                dataListC.add(voList.stream().map(TestVO::getName).collect(Collectors.toList()));
            dataListC.add(voList.stream().map(TestVO::getPlanStartCoreNum).collect(Collectors.toList()));
            dataListC.add(voList.stream().map(TestVO::getActualStartCoreNum).collect(Collectors.toList()));
            dataListC.add(voList.stream().map(TestVO::getInGroupNum).collect(Collectors.toList()));
            dataListC.add(voList.stream().map(TestVO::getActualNum).collect(Collectors.toList()));
            dataListC.add(voList.stream().map(TestVO::getExitNum).collect(Collectors.toList()));
        }


        EasyExcel.write("D:/pdf/export.xlsx").head(tempHead).sheet().doWrite(dataListC);
    }





    /**
     * 由于我们查询到的数据大部分都是List<vo>,但是这个方法需要的结果数据是List<Map<String,Object>>
     * List<Object>转为List<Map<string,objct>
     * @param object
     * @return
     * @author furao
     */
    public static List<Map<String, ?>> getKeysAndValues(List<?> object) {
        List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();
        for (Object obj : object) {
            Class userCla;
            // 得到类对象
            userCla = obj.getClass();
            /* 得到类中的所有属性集合 */
            Field[] fs = userCla.getDeclaredFields();
            Map<String, Object> listChild = new HashMap<String, Object>();
            for (int i = 0; i < fs.length; i++) {
                Field f = fs[i];
                ReflectionUtils.makeAccessible(f);// 设置些属性是可以访问的
                Object val = new Object();
                try {
                    val = f.get(obj);
                    // 得到此属性的值
                    listChild.put(f.getName(), val);// 设置键值
                } catch (IllegalArgumentException e) {
                    log.info("非法参数异常");
                } catch (IllegalAccessException e) {
                    log.info("非法访问异常");
                }
            }
            list.add(listChild);// 将map加入到list集合中
        }
        log.info("多个（列表）对象的所有键值====" + list.toString());
        return list;
    }


}
